{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## K means"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 0. 引入依赖"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "# 从sklearn 中直接生成聚类算法\n",
    "from sklearn.datasets.samples_generator import make_blobs"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 1.数据加载"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "x, y = make_blobs(n_samples = 100, centers=6, random_state=1234, cluster_std=0.6)\n",
    "plt.figure(figsize=(6,6))\n",
    "plt.scatter(x[:,0],x[:,1], c=y)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2. 算法实现"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 引入scipy 中的距离函数，默认欧氏距离\n",
    "from scipy.spatial.distance import cdist\n",
    "\n",
    "class K_Means(object):\n",
    "    # 初始化 参数 n_clusters(K) 迭代次数 max_iter,初始质心 centroids\n",
    "    def __init__(self, n_clusters=6, max_iter=300, centroids=[]):\n",
    "        self.n_clusters = 6\n",
    "        self.max_iter = max_iter\n",
    "        self.centroids = np.array(centroids, dtype=np.float)\n",
    "        \n",
    "    # 训练模型方法， k-means 聚类过程，传入原始数据\n",
    "    def fit(self, data):\n",
    "        # 假如没有指定初始质心，就随机选取data 中的点作为质心\n",
    "        if (self.centroids.shape == (0,)):\n",
    "            # 从data 中随机选取0到data行数的6个整数，作为索引值\n",
    "            self.centroids = data[np.random.randint(0, data.shape[0], self.n_clusters),:]\n",
    "        \n",
    "        # 开始迭代\n",
    "        for i in range(self.max_iter):\n",
    "            # 1. 计算距离矩阵\n",
    "            distances = cdist(data, self.centroids)\n",
    "            # 2. 对距离按由近到远排序， 选取最近的质心点的类别， 作为当前点的分类\n",
    "            c_ind = np.argmin(distances, axis = 1)\n",
    "            # 3. 对每一类数据进行均值计算，更新质心点坐标\n",
    "            for i in range(self.n_clusters):\n",
    "                # 排除掉没有在c_ind 里的类别\n",
    "                if i in c_ind:\n",
    "                    # 选出所有类别是i 的点， 取data 里面坐标的均值，更新第i个质心\n",
    "                    self.centroids[i] = np.mean(data[c_ind==i], axis = 0)\n",
    "    \n",
    "    # 预测方法\n",
    "    def predict(self, sample):\n",
    "        # 先计算距离矩阵，然后选取距离最近的质心的类别\n",
    "        distances = cdist(sample, self.centroids)\n",
    "        c_ind = np.argmin(distances, axis = 1)\n",
    "        \n",
    "        return c_ind\n",
    "    \n",
    "# dist = np.array([[121, 221,32,43],\n",
    "#                 [121, 1,12,23],\n",
    "#                 [65, 21,2,43],\n",
    "#                 [1, 221,32,43],\n",
    "#                 [21, 11,22,3]])\n",
    "    \n",
    "# c_ind = np.argmin(dist, axis=1)\n",
    "# print(c_ind)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3. 测试"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 5.76444812 -4.67941789]\n",
      " [-2.89174024 -0.22808556]\n",
      " [-5.89115978  2.33887408]\n",
      " [-4.53406813  6.11523454]\n",
      " [-1.15698106  5.63230377]\n",
      " [ 9.20551979  7.56124841]]\n",
      "[1 5]\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<matplotlib.collections.PathCollection at 0x7fd6eaf75160>"
      ]
     },
     "execution_count": 56,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1152x432 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def plotKMeans(x, y,centroids, subplot, title):\n",
    "    # 分配子图 121 表示1行2列的子图中的第一个\n",
    "    plt.subplot(subplot)\n",
    "    plt.scatter(x[:,0], x[:,1], c='r')\n",
    "    # 画出质心点\n",
    "    plt.scatter(centroids[:,0], centroids[:,1], c= np.array(range(6)), s = 100)\n",
    "    plt.title(title)\n",
    "    \n",
    "kmeans = K_Means(max_iter=300, centroids=np.array([[2,1],[2,2],[2,3],[2,4],[2,5],[2,6]]))\n",
    "\n",
    "plt.figure(figsize=(16,6))\n",
    "\n",
    "plotKMeans(x, y, kmeans.centroids, 121, \"Initial State\")\n",
    "\n",
    "# 开始聚类\n",
    "kmeans.fit(x)\n",
    "\n",
    "plotKMeans(x, y, kmeans.centroids, 122, \"Final State\")\n",
    "\n",
    "\n",
    "### 预测新数据的类别\n",
    "x_new = np.array([[0,0], [10, 7]])\n",
    "y_pred = kmeans.predict(x_new)\n",
    "\n",
    "print(kmeans.centroids)\n",
    "print(y_pred)\n",
    "plt.scatter(x_new[:,0], x_new[:,1], s =100, c='black')"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.2"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
